package collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 排序自定义类型元素
 */
public class SortListDemo2 {
    public static void main(String[] args) {
        List<Point> list = new ArrayList<>();
        list.add(new Point(1, 2));
        list.add(new Point(30, 78));
        list.add(new Point(56, 37));
        list.add(new Point(1, 6));
        list.add(new Point(0, 1));
        list.add(new Point(9, 34));
        System.out.println(list);
        /*
            compare:比较

            Collections.sort(List list)
            该方法要求集合元素必须可比较(元素必须实现Comparable接口)

            如果将来sort方法不可以直接使用则不使用，因为它要求我们的元素必须为其
            实现一个接口并重写对应的方法，这对我们的代码产生了侵入性，所以不建议使用。

            什么是侵入性:当我们调用某个API时，其反过来要求我们为其修改额外的代码
            它不利于程序后期的维护
         */
//        Collections.sort(list);


//        MyComparator comparator = new MyComparator();
//        Collections.sort(list,comparator);



        //使用匿名内部类形式创建比较器
//        Comparator<Point> comparator = new Comparator<Point>() {
//            @Override
//            public int compare(Point o1, Point o2) {
//                int len1 = o1.getX() * o1.getX() + o1.getY() * o1.getY();
//                int len2 = o2.getX() * o2.getX() + o2.getY() * o2.getY();
//                return len1 - len2;
//            }
//        };
//        Collections.sort(list,comparator);


        Collections.sort(list,new Comparator<Point>() {
            @Override
            public int compare(Point o1, Point o2) {
                int len1 = o1.getX() * o1.getX() + o1.getY() * o1.getY();
                int len2 = o2.getX() * o2.getX() + o2.getY() * o2.getY();
                return len1 - len2;
            }
        });



        System.out.println(list);
    }
}


//class MyComparator implements Comparator<Point> {
//    @Override
//    public int compare(Point o1, Point o2) {
//        /*
//            方法用于定义o1与o2比较大小的规则
//            返回值:
//            当返回值>0时，表示o1大于o2
//            当返回值<0时，表示o1小于o2
//            当返回值=0时，表示o1与o2相等
//         */
//        int len1 = o1.getX() * o1.getX() + o1.getY() * o1.getY();
//        int len2 = o2.getX() * o2.getX() + o2.getY() * o2.getY();
//        return len1-len2;
//    }
//}
